Mineração de Dados 6

Os tópicos abordados serão:

Vamos instalar os pacotes necessários.

install.packages("plotly")   # pacote para análise gráfica
install.packages("leaflet")   # pacote para criação de mapas
install.packages("rgdal")   # pacote para importação de dados geoespaciais
install.packages("DT")   # pacote para criação de tabelas interativas
install.packages("flexdashboard")  # pacote para criação de dashboards
install.packages("shiny")  # pacote para criaçao de aplicativos interativos

Vamos utilizar também os pacotes stringr, ggplot2 e magrittr, mas estes foram instalados anteriormente.


Exemplo 11 - COVID-19 no estado do Rio de Janeiro

  • O banco de dados corresponde ao número de casos de COVID-19 no período de fevereiro de 2020 a dezembro de 2020, juntamente com outras variáveis, para os municípios do Rio de Janeiro.

  • Os dados forma acessados em https://brasil.io/dataset/covid19/boletim/ em 21 de dezembro de 2020.

  • Fonte: Secretarias de Saúde das Unidades Federativas, dados tratados por Álvaro Justen e equipe de voluntários Brasil.IO (Brasil.IO 2020).

  • Uma pré-filtragem foi feita de forma a reduzir a base de dados para municípios do estado do Rio de Janeiro e remover variáveis que não são de interesse nesta análise.

  • As variáveis:

    • city - cidade;
    • city_ibge_code - código da cidade;
    • date - data;
    • epidemiological_week - semana epidemiológica;
    • estimated_population - população estimada;
    • estimated_population_2019 - população estimada em 2019;
    • last_available_confirmed - casos acumulados;
    • last_available_confirmed_per_100k_inhabitants - taxa acumulada de casos por 100 mil habitantes;
    • last_available_death_rate - taxa acumulada de óbitos;
    • last_available_deaths - número acumulado de óbitos;
    • new_confirmed - novos casos;
    • new_deaths - novos óbitos.

Importando o banco de dados

Arquivo com extensão .csv

Vamos importar a base de dados.

dados <- read.csv("http://im.ufrj.br/~joao/cienciadedados/covid2.csv")
head(dados)   # vislumbre dos dados
names(dados)   # # nomes das colunas do objeto (variáveis)
attach(dados)
##             city city_ibge_code       date epidemiological_week
## 1    Barra Mansa        3300407 2020-03-05                   10
## 2    Barra Mansa        3300407 2020-03-06                   10
## 3 Rio de Janeiro        3304557 2020-03-06                   10
## 4    Barra Mansa        3300407 2020-03-07                   10
## 5 Rio de Janeiro        3304557 2020-03-07                   10
## 6    Barra Mansa        3300407 2020-03-08                   11
##   estimated_population estimated_population_2019 last_available_confirmed
## 1               184833                    184412                        1
## 2               184833                    184412                        1
## 3              6747815                   6718903                        1
## 4               184833                    184412                        1
## 5              6747815                   6718903                        1
## 6               184833                    184412                        1
##   last_available_confirmed_per_100k_inhabitants last_available_date
## 1                                       0.54103          2020-03-05
## 2                                       0.54103          2020-03-06
## 3                                       0.01482          2020-03-06
## 4                                       0.54103          2020-03-06
## 5                                       0.01482          2020-03-06
## 6                                       0.54103          2020-03-08
##   last_available_death_rate last_available_deaths new_confirmed new_deaths
## 1                         0                     0             1          0
## 2                         0                     0             0          0
## 3                         0                     0             1          0
## 4                         0                     0             0          0
## 5                         0                     0             0          0
## 6                         0                     0             0          0
##  [1] "city"                                         
##  [2] "city_ibge_code"                               
##  [3] "date"                                         
##  [4] "epidemiological_week"                         
##  [5] "estimated_population"                         
##  [6] "estimated_population_2019"                    
##  [7] "last_available_confirmed"                     
##  [8] "last_available_confirmed_per_100k_inhabitants"
##  [9] "last_available_date"                          
## [10] "last_available_death_rate"                    
## [11] "last_available_deaths"                        
## [12] "new_confirmed"                                
## [13] "new_deaths"

Na base de dados originais, para evitar problemas com a codificação das palavras com acentos, podemos utitizar a opção encoding=“UTF-8”


Análise dos dados no tempo

  • Vamos inicialmente analisar como os dado se comportam ao longo do tempo.

Análise exloratória do número de novos casos

Antes de começar a análise, vamos verificar se as observações estão ordenadas no tempo de forma correta.

Para este fim, vamos utilizar o pacote stringr (Wickham 2019), que nos permitirá extrair os meses e dias das datas.

library("stringr")
mes <- str_sub(date,6,7)   # posições 6 e 7 correspondem ao mês
dia <- str_sub(date,9,10)   # posições 6 e 7 correspondem ao dia

Agora plotamos os dados em sequência utilizando o gráfico para série temporal do pacote base do R.

Podemos perceber que não há indícios de que os dados estejam desordenados no tempo.

ts.plot(mes)

ts.plot(dia)

Vamos agora investigar o número de casos novos no estado.

aux <- aggregate(new_confirmed,by=list(date),FUN="sum")   # agregando o total de casos por data
data <- aux[,1]  # data
casos <- aux[,2]   # casos
ts.plot(casos)   # grafico básico de séries temporais

plot(casos,type="l",lwd=2,col="darkblue",axes=FALSE,ylab="Novos casos",xlab="Tempo",main="Estado do Rio de Janeiro")
ticks <- seq(0,300,by=50)
axis(1,at=ticks,labels=data[ticks+1],cex.lab=0.5)
axis(2)

Vamos olhar o número de casos somente do município do Rio de Janeiro.

casosrio <- new_confirmed[city=="Rio de Janeiro"]
datario <- date[city=="Rio de Janeiro"]
plot(casosrio,type="l",lwd=2,col="red",axes=FALSE,ylab="Novos casos",xlab="Tempo",main="Município do Rio de Janeiro")
axis(1,at=ticks,labels=datario[ticks+1],cex.lab=0.5)
axis(2)

Podemos investigar outros municípios, como Petrópolis, por exemplo.

casospet <- new_confirmed[city=="Petrópolis"]  
datapet <- date[city=="Petrópolis"]
plot(casospet,type="l",lwd=2,col="darkolivegreen2",axes=FALSE,ylab="Novos casos",xlab="Tempo",main="Petrópolis")
axis(1,at=ticks,labels=datapet[ticks+1],cex.lab=0.5)
axis(2)

Vamos refazer os gráficos utilizando o pacote ggplot2 (Wickham 2016)

library("ggplot2")
ggplot(aux,aes(x=as.Date(aux[,1]),y=aux[,2])) + geom_line(size=1,col="blue") +
  labs(x="Tempo",y="Novos casos",title="Estado do Rio de Janeiro")

ggplot(data.frame(datario,casosrio),aes(x=as.Date(datario),y=casosrio)) + geom_line(size=1,col="red") +
  labs(x="Tempo",y="Novos casos",title="Município do Rio de Janeiro")

ggplot(data.frame(datapet,casospet),aes(x=as.Date(datapet),y=casospet)) + geom_line(size=1,col="darkolivegreen2") +
  labs(x="Tempo",y="Novos casos",title="Petrópolis")

Média móvel

A média móvel é uma medida que busca suavizar o gráfico de uma série temporal ao retirar parte do efeito da variabilidade.

Este processo torna mais fácil a visualização de tendências no tempo.

A média móvel em um determinado instante de tempo \(t\) é dada pela média das observações nos tempos vizinhos.

A escolha do número de tempos vizinhos pode variar. Quanto maior este número, mais suave é a série temporal das médias móveis; quanto menor, menos suave.

Para os casos de COVID-19, é comum considerar que a média móvel em um determinado dia é a média do dia e mais seis dias passados, ou seja, é a media de sete dias.

Vamos construir uma função para calcular a média móvel de uma série temporal.

mm <- function(serie,dias){
  lag <- dias - 1
  aux <- c(rep(NA,l=lag),serie[(lag+1):length(serie)])   # primeiras posições vazias
  for(i in (lag+1):length(aux)){
    aux[i] <- mean(serie[(i-lag):i])
  }
  return(aux)
}

Vamos plotar o número de casos e a média móvel para o estado do Rio de Janeiro.

suav <- mm(casos,7)
df <- data.frame("data"=as.Date(data),"casos"=casos,"suav"=suav)
ggplot(df,aes(x=data,y=casos)) + geom_line(col="blue") +
  labs(x="Tempo",y="Novos casos",title="Estado do Rio de Janeiro") +
  geom_line(aes(data,suav),size=1,col="red")
## Warning: Removed 6 row(s) containing missing values (geom_path).

Vamos utilizar uma outra representação do número de casos.

suav <- mm(casos,7)
df <- data.frame("data"=as.Date(data),"casos"=casos,"suav"=suav)

ggplot(df) + geom_bar(aes(x=data,weight=casos),col="cyan3",fill="cyan3") +
  labs(x="Tempo",y="Novos casos",title="Estado do Rio de Janeiro") +
  geom_line(aes(data,suav),size=1,col="red") + theme_bw()
## Warning: Removed 6 row(s) containing missing values (geom_path).

Vamos calcular as médias móveis dos municípios do Rio de Janeiro e de Petrópolis.

suavrio <- mm(casosrio,7)
suavpet <- mm(casospet,7)
dfrio <- data.frame("data"=as.Date(datario),"casos"=casosrio,"suavrio"=suavrio)
dfpet <- data.frame("data"=as.Date(datapet),"casos"=casospet,"suavrio"=suavpet)

ggplot(dfrio) + geom_bar(aes(x=data,weight=casos),col="coral",fill="coral") +
  geom_line(aes(x=data,y=suavrio),size=1,col="blue") + 
  labs(x="Tempo",y="Novos casos",title="Município do Rio de Janeiro")
## Warning: Removed 6 row(s) containing missing values (geom_path).

ggplot(dfpet) + geom_bar(aes(x=data,weight=casos),col="darkolivegreen3",fill="darkolivegreen3") +
  geom_line(aes(x=data,y=suavrio),size=1,col="black") + 
  labs(x="Tempo",y="Novos casos",title="Petrópolis")
## Warning: Removed 6 row(s) containing missing values (geom_path).


Pacote plotly

  • O pacote plotly (Sievert 2020) oferece uma grande variedade de ferramentas gráficas e de visualização de dados.

  • Ele permite, por exemplo, a confecção de gráficos interativos. Uma galeria com exemplos básicos pode ser vista em https://plotly.com/r/.

Análise exloratória do número de novos casos

Primeiramente, instalaremos o pacote plotly e, em seguida, iremos chamá-lo.

install.packages("plotly")
library("plotly")
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout

Vamos plotar o total de casos no estado do Rio de Janeiro usando a função plot_ly() do pacote plotly.

p <- plot_ly(x=as.Date(data),y=casos,type="scatter",mode="lines",text=data)
p
## Warning: `arrange_()` is deprecated as of dplyr 0.7.0.
## Please use `arrange()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.

Para editarmos os nomes dos eixos, por exemplo, precisamos do operador pipe e utilizar a função layout(). Vamos chamar o pacote magrittr.

library("magrittr")
x <- list(title="Tempo")
y <- list(title="Novos casos")
p <- plot_ly(x=as.Date(data),y=casos,type="scatter",mode="lines",title="Novos casos") %>% layout(xaxis=x,yaxis=y,title="Estado do Rio de Janeiro")
p
## Warning: 'scatter' objects don't have these attributes: 'title'
## Valid attributes include:
## 'type', 'visible', 'showlegend', 'legendgroup', 'opacity', 'name', 'uid', 'ids', 'customdata', 'meta', 'selectedpoints', 'hoverinfo', 'hoverlabel', 'stream', 'transforms', 'uirevision', 'x', 'x0', 'dx', 'y', 'y0', 'dy', 'stackgroup', 'orientation', 'groupnorm', 'stackgaps', 'text', 'texttemplate', 'hovertext', 'mode', 'hoveron', 'hovertemplate', 'line', 'connectgaps', 'cliponaxis', 'fill', 'fillcolor', 'marker', 'selected', 'unselected', 'textposition', 'textfont', 'r', 't', 'error_x', 'error_y', 'xcalendar', 'ycalendar', 'xaxis', 'yaxis', 'idssrc', 'customdatasrc', 'metasrc', 'hoverinfosrc', 'xsrc', 'ysrc', 'textsrc', 'texttemplatesrc', 'hovertextsrc', 'hovertemplatesrc', 'textpositionsrc', 'rsrc', 'tsrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'

Vamos agora adicionar a série temporal da média móvel.

p <- plot_ly(x=as.Date(data),y=casos,type="scatter",mode="lines",name="Novos casos") %>% layout(xaxis=x,yaxis=y,title="Estado do Rio de Janeiro")
p <- p %>% add_trace(y=suav,type="scatter",mode="lines",name="Média móvel")
p

Agora faremos um gráfico utilizando barras para o número de casos.

p <- plot_ly(x=as.Date(data),y=casos,type="bar",name="Novos casos") %>% layout(xaxis=x,yaxis=y,title="Estado do Rio de Janeiro")
p <- p %>% add_trace(y=suav,type="scatter",mode="lines",name="Média móvel")
p

Vamos agora fazer os gráficos para os municípios do Rio de Janeiro e Petrópolis.

p <- plot_ly(x=as.Date(datario),y=casosrio,type="bar",name="Novos casos",color=I("red")) %>% layout(xaxis=x,yaxis=y,title="Município do Rio de Janeiro")
p <- p %>% add_trace(y=suavrio,type="scatter",mode="lines",name="Média móvel",color=I("blue"))
p
p <- plot_ly(x=as.Date(datapet),y=casospet,type="bar",name="Novos casos",color=I("green")) %>% layout(xaxis=x,yaxis=y,title="Município do Rio de Janeiro")
p <- p %>% add_trace(y=suavpet,type="scatter",mode="lines",name="Média móvel",color=I("black"))
p


Pacote leaflet

  • O pacote leaflet (Cheng, Karambelkar, e Xie 2019) permite a integração de mapas em JavaScript no R.

  • Ele fornece grande variedade de opções e flexibilidade para se trabalhar com mapas.

Exemplos (utilização do pacote leaflet)

Vamos instalar e chamar o pacote.

install.packages("leaflet")
library("leaflet")

Como primeiro passo, vamos incluir um mapa com a localização do Centro de Tecnologia da UFRJ.

ct <- leaflet()   # inicializa o mapa
ct <- addTiles(ct)   # adiciona uma camada ao mapa
ct <- addMarkers(ct,lat=-22.85809187293725,lng=-43.23112677625925,popup="Centro de Tecnologia da UFRJ")   # adiciona um marcador ao mapa
ct   # plota o mapa

A função addTiles() acrescenta uma camada padrão do OpenStreetMap (https://www.openstreetmap.org/#map=4/-15.13/-53.19). Entreanto, camadas de outra fonte podem ser utilizadas por meio da função addProviderTiles().

Vamos verificas as fontes disponíveis.

names(providers)
##   [1] "OpenStreetMap"                      
##   [2] "OpenStreetMap.Mapnik"               
##   [3] "OpenStreetMap.DE"                   
##   [4] "OpenStreetMap.CH"                   
##   [5] "OpenStreetMap.France"               
##   [6] "OpenStreetMap.HOT"                  
##   [7] "OpenStreetMap.BZH"                  
##   [8] "OpenSeaMap"                         
##   [9] "OpenPtMap"                          
##  [10] "OpenTopoMap"                        
##  [11] "OpenRailwayMap"                     
##  [12] "OpenFireMap"                        
##  [13] "SafeCast"                           
##  [14] "Thunderforest"                      
##  [15] "Thunderforest.OpenCycleMap"         
##  [16] "Thunderforest.Transport"            
##  [17] "Thunderforest.TransportDark"        
##  [18] "Thunderforest.SpinalMap"            
##  [19] "Thunderforest.Landscape"            
##  [20] "Thunderforest.Outdoors"             
##  [21] "Thunderforest.Pioneer"              
##  [22] "Thunderforest.MobileAtlas"          
##  [23] "Thunderforest.Neighbourhood"        
##  [24] "OpenMapSurfer"                      
##  [25] "OpenMapSurfer.Roads"                
##  [26] "OpenMapSurfer.Hybrid"               
##  [27] "OpenMapSurfer.AdminBounds"          
##  [28] "OpenMapSurfer.ContourLines"         
##  [29] "OpenMapSurfer.Hillshade"            
##  [30] "OpenMapSurfer.ElementsAtRisk"       
##  [31] "Hydda"                              
##  [32] "Hydda.Full"                         
##  [33] "Hydda.Base"                         
##  [34] "Hydda.RoadsAndLabels"               
##  [35] "MapBox"                             
##  [36] "Stamen"                             
##  [37] "Stamen.Toner"                       
##  [38] "Stamen.TonerBackground"             
##  [39] "Stamen.TonerHybrid"                 
##  [40] "Stamen.TonerLines"                  
##  [41] "Stamen.TonerLabels"                 
##  [42] "Stamen.TonerLite"                   
##  [43] "Stamen.Watercolor"                  
##  [44] "Stamen.Terrain"                     
##  [45] "Stamen.TerrainBackground"           
##  [46] "Stamen.TerrainLabels"               
##  [47] "Stamen.TopOSMRelief"                
##  [48] "Stamen.TopOSMFeatures"              
##  [49] "TomTom"                             
##  [50] "TomTom.Basic"                       
##  [51] "TomTom.Hybrid"                      
##  [52] "TomTom.Labels"                      
##  [53] "Esri"                               
##  [54] "Esri.WorldStreetMap"                
##  [55] "Esri.DeLorme"                       
##  [56] "Esri.WorldTopoMap"                  
##  [57] "Esri.WorldImagery"                  
##  [58] "Esri.WorldTerrain"                  
##  [59] "Esri.WorldShadedRelief"             
##  [60] "Esri.WorldPhysical"                 
##  [61] "Esri.OceanBasemap"                  
##  [62] "Esri.NatGeoWorldMap"                
##  [63] "Esri.WorldGrayCanvas"               
##  [64] "OpenWeatherMap"                     
##  [65] "OpenWeatherMap.Clouds"              
##  [66] "OpenWeatherMap.CloudsClassic"       
##  [67] "OpenWeatherMap.Precipitation"       
##  [68] "OpenWeatherMap.PrecipitationClassic"
##  [69] "OpenWeatherMap.Rain"                
##  [70] "OpenWeatherMap.RainClassic"         
##  [71] "OpenWeatherMap.Pressure"            
##  [72] "OpenWeatherMap.PressureContour"     
##  [73] "OpenWeatherMap.Wind"                
##  [74] "OpenWeatherMap.Temperature"         
##  [75] "OpenWeatherMap.Snow"                
##  [76] "HERE"                               
##  [77] "HERE.normalDay"                     
##  [78] "HERE.normalDayCustom"               
##  [79] "HERE.normalDayGrey"                 
##  [80] "HERE.normalDayMobile"               
##  [81] "HERE.normalDayGreyMobile"           
##  [82] "HERE.normalDayTransit"              
##  [83] "HERE.normalDayTransitMobile"        
##  [84] "HERE.normalDayTraffic"              
##  [85] "HERE.normalNight"                   
##  [86] "HERE.normalNightMobile"             
##  [87] "HERE.normalNightGrey"               
##  [88] "HERE.normalNightGreyMobile"         
##  [89] "HERE.normalNightTransit"            
##  [90] "HERE.normalNightTransitMobile"      
##  [91] "HERE.reducedDay"                    
##  [92] "HERE.reducedNight"                  
##  [93] "HERE.basicMap"                      
##  [94] "HERE.mapLabels"                     
##  [95] "HERE.trafficFlow"                   
##  [96] "HERE.carnavDayGrey"                 
##  [97] "HERE.hybridDay"                     
##  [98] "HERE.hybridDayMobile"               
##  [99] "HERE.hybridDayTransit"              
## [100] "HERE.hybridDayGrey"                 
## [101] "HERE.hybridDayTraffic"              
## [102] "HERE.pedestrianDay"                 
## [103] "HERE.pedestrianNight"               
## [104] "HERE.satelliteDay"                  
## [105] "HERE.terrainDay"                    
## [106] "HERE.terrainDayMobile"              
## [107] "FreeMapSK"                          
## [108] "MtbMap"                             
## [109] "CartoDB"                            
## [110] "CartoDB.Positron"                   
## [111] "CartoDB.PositronNoLabels"           
## [112] "CartoDB.PositronOnlyLabels"         
## [113] "CartoDB.DarkMatter"                 
## [114] "CartoDB.DarkMatterNoLabels"         
## [115] "CartoDB.DarkMatterOnlyLabels"       
## [116] "CartoDB.Voyager"                    
## [117] "CartoDB.VoyagerNoLabels"            
## [118] "CartoDB.VoyagerOnlyLabels"          
## [119] "CartoDB.VoyagerLabelsUnder"         
## [120] "HikeBike"                           
## [121] "HikeBike.HikeBike"                  
## [122] "HikeBike.HillShading"               
## [123] "BasemapAT"                          
## [124] "BasemapAT.basemap"                  
## [125] "BasemapAT.grau"                     
## [126] "BasemapAT.overlay"                  
## [127] "BasemapAT.highdpi"                  
## [128] "BasemapAT.orthofoto"                
## [129] "nlmaps"                             
## [130] "nlmaps.standaard"                   
## [131] "nlmaps.pastel"                      
## [132] "nlmaps.grijs"                       
## [133] "nlmaps.luchtfoto"                   
## [134] "NASAGIBS"                           
## [135] "NASAGIBS.ModisTerraTrueColorCR"     
## [136] "NASAGIBS.ModisTerraBands367CR"      
## [137] "NASAGIBS.ViirsEarthAtNight2012"     
## [138] "NASAGIBS.ModisTerraLSTDay"          
## [139] "NASAGIBS.ModisTerraSnowCover"       
## [140] "NASAGIBS.ModisTerraAOD"             
## [141] "NASAGIBS.ModisTerraChlorophyll"     
## [142] "NLS"                                
## [143] "JusticeMap"                         
## [144] "JusticeMap.income"                  
## [145] "JusticeMap.americanIndian"          
## [146] "JusticeMap.asian"                   
## [147] "JusticeMap.black"                   
## [148] "JusticeMap.hispanic"                
## [149] "JusticeMap.multi"                   
## [150] "JusticeMap.nonWhite"                
## [151] "JusticeMap.white"                   
## [152] "JusticeMap.plurality"               
## [153] "Wikimedia"                          
## [154] "GeoportailFrance"                   
## [155] "GeoportailFrance.parcels"           
## [156] "GeoportailFrance.ignMaps"           
## [157] "GeoportailFrance.maps"              
## [158] "GeoportailFrance.orthos"            
## [159] "OneMapSG"                           
## [160] "OneMapSG.Default"                   
## [161] "OneMapSG.Night"                     
## [162] "OneMapSG.Original"                  
## [163] "OneMapSG.Grey"                      
## [164] "OneMapSG.LandLot"
ct <- leaflet()   # inicializa o mapa
ct <- addProviderTiles(ct,providers$Esri.WorldPhysical)   # adiciona uma camada ao mapa
ct <- addMarkers(ct,lat=-22.85809187293725,lng=-43.23112677625925,popup="Centro de Tecnologia da UFRJ")   # adiciona um marcador ao mapa
ct   # plota o mapa

Vamos refazer o mapa anterior acrescentando algumas opções.

fig <- makeIcon("C:/Users/joaob/OneDrive/Desktop/Dados/godzilla.png",
                iconWidth = 100, iconHeight = 130)   # criando um ícone a partir de uma figura
texto <- "<b>Centro de Tecnologia</b><br/>Av. Athos da Silveira Ramos, 149<br/>Cidada Universitária"   # texto em HTML
ct <- leaflet()   # inicializa o mapa
ct <- addTiles(ct)   # adiciona uma camada ao mapa
ct <- addMarkers(ct,lat=-22.85809187293725,lng=-43.23112677625925,popup=texto,icon=fig)   # adiciona um marcador ao mapa
ct   # plota o mapa

Talvez o encadeamento das funções fique mais intuitivo se utilizarmos o operador pipe. Vamos repetir os comandos anteriores.

ct <- leaflet() %>% addTiles() %>% addMarkers(ct,lat=-22.85809187293725,lng=-43.23112677625925,popup=texto,icon=fig)
ct

Um guia para utilização do leaflet no R pode ser visto em https://rstudio.github.io/leaflet/.

Lendo arquivos de dados geoespaciais

Shapefile é, provavelmente, o formato mais popular de arquivo com dados geoespaciais.

Os dados são representados por pontos (localizações, por exemplo), linhas (rios ou ruas, por exemplo) e polígonos (cidade, bairro, por exemplo).

Um shapefile, na verdade é composto por vários arquivos.

Outro formato popular de arquivo de dados geoespaciais é geoJSON, que representa os recursos de forma análoga ao shapefile: pontos, linhas e polígonos.

O pacote rgdal permite que os dados nestes dois formatos sejam lidos e interpretados como mapas no R. Portanto, vamos instalá-lo.

install.packages("rgdal")


Análise dos dados no espaço

  • Vamos agora analisar como os dado se comportam ao longo do estado do Rio de Janeiro.

Mapa do estado do Rio de Janeiro

Vamos, inicialmente, ler os dados geoespaciais do estado do Rio de Janeiro e ver as como podemos trabalhar com seu mapa.

library("rgdal")
## Loading required package: sp
## rgdal: version: 1.5-18, (SVN revision 1082)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 3.0.4, released 2020/01/28
## Path to GDAL shared files: C:/Program Files/R/R-3.6.3/library/rgdal/gdal
## GDAL binary built with GEOS: TRUE 
## Loaded PROJ runtime: Rel. 6.3.1, February 10th, 2020, [PJ_VERSION: 631]
## Path to PROJ shared files: C:/Program Files/R/R-3.6.3/library/rgdal/proj
## Linking to sp version:1.4-4
## To mute warnings of possible GDAL/OSR exportToProj4() degradation,
## use options("rgdal_show_exportToProj4_warnings"="none") before loading rgdal.
mapa <- readOGR("http://im.ufrj.br/~joao/cienciadedados/rio.json")
## OGR data source with driver: GeoJSON 
## Source: "C:\Users\joaob\OneDrive\Desktop\Dados\rio.json", layer: "rio"
## with 92 features
## It has 3 fields

Vamos plotar o mapa de forma simples e ver algumas de suas características.

plot(mapa,col="light blue")

names(mapa)
## [1] "id"          "name"        "description"
head(mapa$name)
## [1] Angra dos Reis        Aperibé              Araruama             
## [4] Areal                 Armação dos Búzios Arraial do Cabo      
## 92 Levels: Angra dos Reis Aperibé Araruama Areal ... Volta Redonda

O mapa do estado do Rio de Janeiro e outros mapas estão disponíveis em https://github.com/tbrugz/geodata-br.

Vamos agora utilizar o leaflet para produzir mapas mais sofisticados.

lmapa <- leaflet(mapa) %>% addPolygons()
lmapa

Vamos modificar algumas opções.

lmapa <- leaflet(mapa) %>% addPolygons(weight=1,color="black",fillColor="yellow",label=~name,highlightOptions = highlightOptions(color="white",weight=3,
      bringToFront = TRUE)) %>% addCircles(lat=-22.85809187293725,lng=-43.23112677625925,radius=8000,col="red",label="Ilha do Fundão")
lmapa

Análise exloratória da taxa de casos acumulados

Vamos ver como se comportam as taxas de casos acumulados por 100 mil habitantes ao longo do estado do Rio de Janeiro na última data do banco de dados, que é 20 de dezembro de 2020.

dez <- date[length(date)]   # última data
dez
## [1] 2020-12-20
## 291 Levels: 2020-03-05 2020-03-06 2020-03-07 2020-03-08 ... 2020-12-20
acdez <- last_available_confirmed_per_100k_inhabitants[date==dez]   # taxa acumulada na última dada
head(acdez)
## [1] 3662.990 1999.832 1591.297 2462.704 3193.433 1075.409
cidez <- city[date==dez]   # municípios na última data
iddez <- city_ibge_code[date==dez]   # códigos dos municíos na última data

Queremos incluir a informação da taxa no mapa. Para isto, podemos utilizar a função merge(). O identidicador comum será o código do município.

Vamos aproveitar e colocar os nomes sem problema de codificação no mapa.

df <- data.frame("taxa"=acdez,"id"=iddez,"cidade"=cidez)
head(df)
##       taxa      id             cidade
## 1 3662.990 3300100     Angra dos Reis
## 2 1999.832 3300159            Aperibé
## 3 1591.297 3300209           Araruama
## 4 2462.704 3300225              Areal
## 5 3193.433 3300233 Armação dos Búzios
## 6 1075.409 3300258    Arraial do Cabo
mapanew <- merge(mapa,df,by="id")
names(mapanew)
## [1] "id"          "name"        "description" "taxa"        "cidade"

Agora vamos fazer um mapa cloroplético em que as cores das cidades correspondem à sua taxa.

# cores por quantis
cores <- colorQuantile(heat.colors(10),NULL)   # palheta que será utilizada

lmapa1 <- leaflet(mapanew) %>% addPolygons(weight=0.5,color="black",label=~paste0(cidade,": ",round(taxa,2)),fillColor=~cores(taxa),smoothFactor=0.5,opacity=0.8, fillOpacity=0.5,highlightOptions=highlightOptions(color="white",weight=5,bringToFront=TRUE)) %>% addLegend(pal=cores,values=~taxa,opacity=0.5)

lmapa1
# cores por valor
cores <- colorNumeric("magma",NULL)   # palheta do pacote viridisLite

lmapa2 <- leaflet(mapanew) %>% addPolygons(weight=0.5,color="black",label=~paste0(cidade,": ",round(taxa,2)),fillColor=~cores(log(taxa)),smoothFactor=0.5,opacity=0.8, fillOpacity=0.5,highlightOptions=highlightOptions(color="white",weight=5,bringToFront=TRUE)) %>% addLegend(pal=cores,values=~log(taxa),opacity=0.5)

lmapa2

Vamos comparar com o mapa de 20 de dezembro com o de 31 de outubro.

out <- "2020-10-31"
out
## [1] "2020-10-31"
acout <- last_available_confirmed_per_100k_inhabitants[date==out]   # acumulados
head(acout)
## [1] 3019.1650 1722.5443 1323.9707 2186.4393 1673.5795  768.1496
idout <- city_ibge_code[date==out]   # códigos dos municíos
df <- data.frame("taxaout"=acout,"id"=idout)
head(df)
##     taxaout      id
## 1 3019.1650 3300100
## 2 1722.5443 3300159
## 3 1323.9707 3300209
## 4 2186.4393 3300225
## 5 1673.5795 3300233
## 6  768.1496 3300258
mapanew2 <- merge(mapanew,df,by="id")
names(mapanew2)
## [1] "id"          "name"        "description" "taxa"        "cidade"     
## [6] "taxaout"
# cores por quantis
cores <- colorQuantile(heat.colors(10),NULL)   # palheta que será utilizada

lmapa3 <- leaflet(mapanew2) %>% addPolygons(weight=0.5,color="black",label=~paste0(cidade,": ",round(taxaout,2)),fillColor=~cores(taxaout),smoothFactor=0.5,opacity=0.8, fillOpacity=0.5,highlightOptions=highlightOptions(color="white",weight=5,bringToFront=TRUE)) %>% addLegend(pal=cores,values=~taxaout,opacity=0.5)

lmapa3
# cores por valor
cores <- colorNumeric("magma",NULL)   # palheta do pacote viridisLite

lmapa4 <- leaflet(mapanew2) %>% addPolygons(weight=0.5,color="black",label=~paste0(cidade,": ",round(taxaout,2)),fillColor=~cores(log(taxaout)),smoothFactor=0.5,opacity=0.8, fillOpacity=0.5,highlightOptions=highlightOptions(color="white",weight=5,bringToFront=TRUE)) %>% addLegend(pal=cores,values=~log(taxaout),opacity=0.5)

lmapa4


Pacote DT

  • O pacote DT (Xie, Cheng, e Tan 2020) permite a integração de tabelas da biblioteca DataTables do JavaScrit no R.

Número de casos em uma tabela dinâmica

Vamos instalar e chamar o pacote.

install.packages("DT")
library("DT")

Vamos fazer um tabela com o número de casos e número de casos acumulados de 1 de outubro até 21 de dezembro.

mes <- str_sub(date,6,7)   # criando uma coluna de mês
dados2 <- dados[((mes=="10")|(mes=="11")|(mes=="12")),]   # considerando somente os meses 10, 11 e 12
head(dados2)
##                     city city_ibge_code       date epidemiological_week
## 16007     Angra dos Reis        3300100 2020-10-01                   40
## 16008            Aperibé        3300159 2020-10-01                   40
## 16009           Araruama        3300209 2020-10-01                   40
## 16010              Areal        3300225 2020-10-01                   40
## 16011 Armação dos Búzios        3300233 2020-10-01                   40
## 16012    Arraial do Cabo        3300258 2020-10-01                   40
##       estimated_population estimated_population_2019 last_available_confirmed
## 16007               207044                    203785                     5567
## 16008                11901                     11759                      189
## 16009               134293                    132400                     1510
## 16010                12669                     12572                      219
## 16011                34477                     33870                      463
## 16012                30593                     30349                      185
##       last_available_confirmed_per_100k_inhabitants last_available_date
## 16007                                     2688.8005          2020-10-01
## 16008                                     1588.1018          2020-10-01
## 16009                                     1124.4071          2020-10-01
## 16010                                     1728.6289          2020-10-01
## 16011                                     1342.9243          2020-10-01
## 16012                                      604.7135          2020-10-01
##       last_available_death_rate last_available_deaths new_confirmed new_deaths
## 16007                    0.0334                   186            51          3
## 16008                    0.0370                     7             1          0
## 16009                    0.0430                    65            35          0
## 16010                    0.0365                     8             0          0
## 16011                    0.0302                    14             1          1
## 16012                    0.0324                     6             0          0
dadosdt <- data.frame("Cidade"=dados2$city,"Data"=as.Date(dados2$date),"Acumulados"=dados2$last_available_confirmed,"Novos"=dados2$new_confirmed)
datatable(dadosdt)


Dashboards

  • Dashboards são ótimas ferramentas de visualização de dados.

  • Eles podem comunicar uma grande variedade de informação de forma prática e, por vezes, interativa.

  • Dashboards podem ser feitos de forma fácil no R Markdown por meio do pacote flexdashboard.

Exemplos de dashboards

Vamos instalar e chamar o pacote flexdashboard (Iannone, Allaire, e Borges 2020) e, em seguida, faremos alguns exemplos.

install.packages("flexdashboard")
library("flexdashboard")

No primeiro exemplo construímos um dashboard com algumas análises de bases de dados do pacote base do R. Acesse aqui.

No segundo exemplo contruímos um dashboard com os reultados da análise da COVID-19 no estado do Rio de Janeiro. Acesse aqui.


Pacote shiny

  • O pacote shiny (Chang et al. 2020) permite a criação de aplicativos interativos.

  • Os aplicativos podem ser criados em uma página HTML independente ou serem incorporados em um documento do R Markdown.

  • Detalhes sobre o pacote podem ser vistos em https://shiny.rstudio.com/tutorial/written-tutorial/lesson1/.

  • Uma vez construídos, os aplicativos podem ser rodados localmente ou publicados, com certa limitação de acesso, em https://www.shinyapps.io/.

Referências

Brasil.IO. 2020. Boletins epidemiológicos da COVID-19 por município por dia. http://engineering.purdue.edu/~mark/puthesis.

Chang, W., J. Cheng, J. J. Allaire, Y. Xie, e J. McPherson. 2020. shiny: Web Application Framework for R. https://CRAN.R-project.org/package=shiny.

Cheng, J., B. Karambelkar, e Y. Xie. 2019. leaflet: Create Interactive Web Maps with the JavaScript ’Leaflet’ Library. https://CRAN.R-project.org/package=leaflet.

Iannone, R., J. J. Allaire, e B. Borges. 2020. flexdashboard: R Markdown Format for Flexible Dashboards. https://CRAN.R-project.org/package=flexdashboard.

Sievert, C. 2020. Interactive Web-Based Data Visualization with R, plotly, and shiny. Chapman; Hall/CRC. https://plotly-r.com.

Wickham, H. 2016. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.

———. 2019. stringr: Simple, Consistent Wrappers for Common String Operations. https://CRAN.R-project.org/package=stringr.

Xie, Y., J. Cheng, e X. Tan. 2020. DT: A Wrapper of the JavaScript Library ’DataTables’. https://CRAN.R-project.org/package=DT.